﻿using System;
using System.ComponentModel;
using System.Globalization;

namespace MathService
{
    internal class ComplexConverter : TypeConverter<Complex>
    {
        public override object ConvertFrom(ITypeDescriptorContext Context, CultureInfo Info, object value)
        {
            //Не указано объекта для преобразования
            if(value == null)
                throw new ArgumentNullException("value");

            //Оргумент не является трокой, либо строка пуста
            var lv_Str = value as string;
            if(string.IsNullOrEmpty(lv_Str) || lv_Str.Length < 1)
                return base.ConvertFrom(Context, Info, value);

            //Contract.Requires(lv_Str.Length > 0);
            //Убираем все начальные и конечные скобки, ковычки и апострофы
            while(lv_Str[0] == '{' && lv_Str[lv_Str.Length - 1] == '}')
                lv_Str = lv_Str.Substring(1, lv_Str.Length - 2);
            while(lv_Str[0] == '[' && lv_Str[lv_Str.Length - 1] == ']')
                lv_Str = lv_Str.Substring(1, lv_Str.Length - 2);
            while(lv_Str[0] == '(' && lv_Str[lv_Str.Length - 1] == ')')
                lv_Str = lv_Str.Substring(1, lv_Str.Length - 2);
            while(lv_Str[0] == '\'' && lv_Str[lv_Str.Length - 1] == '\'')
                lv_Str = lv_Str.Substring(1, lv_Str.Length - 2);
            while(lv_Str[0] == '"' && lv_Str[lv_Str.Length - 1] == '"')
                lv_Str = lv_Str.Substring(1, lv_Str.Length - 2);

            lv_Str = lv_Str.Replace(" ", "");

            var values = lv_Str.Split('+', '-');
            var signs = new bool[values.Length];
            var im = new bool[values.Length];

            var lv_Result = new Complex();

            var index = 0;
            for(var i = 0; i < values.Length; i++)
            {
                var v = values[i];
                var v_index = lv_Str.IndexOf(values[i], index);
                index = v_index + v.Length;
                signs[i] = v_index > 1 ? lv_Str[v_index - 1] == '-' : false;
                if(v.IndexOf('i') != -1 || v.IndexOf('j') != -1)
                {
                    im[i] = true;
                    v = v.Replace("i", "").Replace("j", "");
                }
                var val = double.Parse(v);
                if(signs[i]) val *= -1;
                if(im[i])
                    lv_Result.Im += val;
                else
                    lv_Result.Re += val;

            }
            return lv_Result;
        }
    }
}
